Compiler=g++
Compiler_flags=-pedantic-errors -Wall -Weffc++ -Wextra -Wsign-conversion 
Compiler_libs_flags=-lncurses 
Cpp_version=-std=c++20

Include_dir=includes
Src_dir=src

Cpp_files=$(shell ls $(Src_dir) | grep \.cpp) 
Cpp_files_with_paths=$(wildcard $(Src_dir)/*.cpp )
Cpp_files_in_subdirs_with_paths=$(wildcard $(Src_dir)/**/*.cpp ) # Find all cpp in dirs and subdirs ( src/menu/menu.cpp src/point/point.cpp ) список путей ко всем cpp-файлам в каталоге Src_dir и его подкаталогах.
Include_dirs=$(wildcard $(Include_dir)/*)                        # Find all header dirs and subdirs ( includes/menu includes/point ) список путей ко всем каталогам, содержащим заголовочные файлы.

# g++ src/main.cpp src/menu/menu.cpp src/point/point.cpp -o main -std=c++20 -pedantic-errors -Wall -Weffc++ -Wextra -Wsign-conversion  -lncurses -Iincludes/menu  -Iincludes/point;  g++ src/menu.cpp src/menu/menu.cpp src/point/point.cpp -o menu -std=c++20 -pedantic-errors -Wall -Weffc++ -Wextra -Wsign-conversion  -lncurses   -Iincludes/menu  -Iincludes/point;
# Put all headers dirs in option -I for g++: $(foreach dir, $(Include_dirs), -I$(dir)) 
# $^ = $(Cpp_files_in_subdirs_with_paths)

${Cpp_files}: $(Cpp_files_in_subdirs_with_paths) # говорит make, что все файлы перечисленные в Cpp_files ( src/main.cpp src/menu.cpp ) должны быть собраны с использованием файлов, указанных в $Cpp_files_in_subdirs_with_paths ( src/menu/menu.cpp src/point/point.cpp )
	$(foreach cpp_file, $(Cpp_files), $(Compiler) ${Src_dir}/$(cpp_file) $^ -o $(basename $(cpp_file)) $(Cpp_version) $(Compiler_flags) $(Compiler_libs_flags) $(foreach dir, $(Include_dirs), -I$(dir));)

clean:
	$(foreach bin_file, $(basename $(Cpp_files)), rm -rvf ${bin_file};)